#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>

const int num = 5;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;    // 创建一个全局的条件变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 创建一个全局的互斥量

void *Wait(void *args)
{
    const char *name = static_cast<char *>(args);
    while (true)
    {
        // 加锁
        pthread_mutex_lock(&mutex);
        // 让所有线程一进来就再cond的条件下等待
        pthread_cond_wait(&cond, &mutex);
        std::cout << name << ", 正在运行....." << std::endl;
        // 解锁
        pthread_mutex_unlock(&mutex);
    }

    return nullptr;
}

int main()
{
    pthread_t tid[num];// 启动5个线程
    for(int i = 0; i < num; i++)
    {
        char* name = new char[128];
        snprintf(name, 128, "thread_%d", i+1);
        pthread_create(tid+i, nullptr, Wait, (void*)name);//创建5个线程
    }

    sleep(3);//d等所有的线程起来

    // 主线程唤醒新线程
    while(true)
    {
        std::cout << "Main wake up new thread: " << std::endl;
        // pthread_cond_signal(&cond);// 唤醒一个
        pthread_cond_broadcast(&cond);
        sleep(1);
    }

    // 等待线程
    for(int i = 0; i < num; i++)
    {
        pthread_join(*(tid+i), nullptr);
    }

    return 0;
}


